import axios from 'axios'
import { message } from 'ant-design-vue'

// 防止重复跳转的标志
let isRedirecting = false

// 跳转到登录页面的函数
const redirectToLogin = () => {
  if (isRedirecting) return

  isRedirecting = true
  const currentUrl = encodeURIComponent(window.location.href)

  // 延迟重置标志，避免过快的重复请求
  setTimeout(() => {
    isRedirecting = false
  }, 2000)

  window.location.href = `/user/login?redirect=${currentUrl}`
}

// 创建 Axios 实例
const myAxios = axios.create({
  baseURL: 'http://39.105.205.47:8099/api',
  timeout: 60000,
  withCredentials: true, // 临时设为false，避免跨域认证问题
})

// 全局请求拦截器
myAxios.interceptors.request.use(
  function (config) {
    // 如果有token，添加到请求头
    const token = localStorage.getItem('token') || sessionStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }

    return config
  },
  function (error) {
    return Promise.reject(error)
  },
)

// 全局响应拦截器
myAxios.interceptors.response.use(
  function (response) {
    const { data } = response
    // 未登录
    if (data.code === 40100) {
      // 特殊处理：如果是获取当前用户信息的请求失败，不触发跳转
      // 因为这是系统初始化时的正常行为
      if (response.request.responseURL.includes('user/get/login')) {
        return response
      }

      // 更严格的条件判断：排除登录相关的所有请求和页面
      const isLoginRelatedRequest =
        response.request.responseURL.includes('user/login') ||
        response.request.responseURL.includes('user/register')

      const isLoginRelatedPage =
        window.location.pathname.includes('/user/login') ||
        window.location.pathname.includes('/user/register') ||
        window.location.hash.includes('/user/login') ||
        window.location.hash.includes('/user/register')

      if (!isLoginRelatedRequest && !isLoginRelatedPage) {
        message.warning('请先登录')
        redirectToLogin()
      }
    }
    return response
  },
  function (error) {
    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status

      if (status === 404) {
        message.error('请求的接口不存在，请检查API路径')
      } else if (status === 500) {
        message.error('服务器内部错误')
      } else if (status === 401) {
        // 只有在非登录页面且非登录请求才跳转
        const isLoginPage =
          window.location.pathname.includes('/user/login') ||
          window.location.pathname.includes('/user/register') ||
          window.location.hash.includes('/user/login') ||
          window.location.hash.includes('/user/register')

        const isLoginRequest =
          error.config?.url?.includes('login') || error.config?.url?.includes('register')

        if (!isLoginPage && !isLoginRequest) {
          message.warning('登录已过期，请重新登录')
          redirectToLogin()
        } else if (isLoginRequest) {
          // 登录请求失败，显示具体错误信息
          const errorMsg = error.response.data?.message || '登录失败'
          message.error(errorMsg)
        }
      } else {
        message.error(`请求失败: ${status}`)
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      message.error('网络连接失败，请检查网络或服务器状态')
    } else {
      // 其他错误
      message.error('请求配置错误')
    }

    return Promise.reject(error)
  },
)

export default myAxios
